在行動應用程式開發中,Intent 和 Activity 是非常重要的概念。Intent 是用來在不同的 Activity 之間進行通訊和協作的工具,還可以用來啟動其他應用程式或系統功能。本章將深入探討 Intent 和 Activity 的基本概念,並通過範例程式展示如何在 B4A 中使用這些工具來實現應用程式的複雜互動。
Intent 是 Android 開發中的一個關鍵概念,它代表著應用程式間或應用程式內部的動作意圖。Intent 可以用來執行多種操作,例如啟動新的 Activity、發送廣播消息,甚至調用系統服務。根據操作的不同,Intent 可以分為以下兩種類型:
Sub btnOpenActivity_Click
Dim intent As Intent
intent.Initialize("","")
intent.SetComponent("com.example.app/.NextActivity")
StartActivity(intent)
End Sub
在這個範例中,我們使用明確 Intent 啟動了名為 NextActivity 的 Activity。SetComponent 方法指定了要啟動的 Activity,格式為「包名/Activity 名稱」。
2. 隱含Intent(Implicit Intent)
隱含 Intent 允許應用程式向系統發出一個一般性的動作請求,而系統會自動選擇合適的應用程式來處理這個請求。例如,打開一個網址或撥打電話都可以使用隱含 Intent。
Sub btnOpenBrowser_Click
Dim intent As Intent
intent.Initialize(intent.ACTION_VIEW, "https://www.b4x.com")
StartActivity(intent)
End Sub
在這個範例中,隱含 Intent 用來打開一個網址,系統會自動選擇瀏覽器來執行這個操作。
在一個應用程式中,Activity 之間通常需要進行資料交換或通知彼此某些事件的發生。這通常通過 Intent 和 Bundle 來實現。
Sub btnSendData_Click
Dim intent As Intent
intent.Initialize("","")
intent.SetComponent("com.example.app/.DetailActivity")
intent.PutExtra("username", "JohnDoe")
intent.PutExtra("age", 30)
StartActivity(intent)
End Sub
在這個範例中,我們使用 PutExtra 方法將 username 和 age 這兩個資訊傳遞給即將啟動的 Activity。
在接收端的 Activity 中,可以通過以下方式獲取這些資料:
Sub Activity_Create(FirstTime As Boolean)
Dim username As String = Activity.GetStartingIntent.GetExtra("username")
Dim age As Int = Activity.GetStartingIntent.GetExtra("age")
Log("Username: " & username)
Log("Age: " & age)
End Sub
Sub btnStartForResult_Click
Dim intent As Intent
intent.Initialize("","")
intent.SetComponent("com.example.app/.InputActivity")
StartActivityForResult(intent)
End Sub
Sub Activity_Result (Result As Int, Intent As Intent)
If Result = RESULT_OK Then
Dim returnedData As String = Intent.GetExtra("inputData")
Log("Returned Data: " & returnedData)
End If
End Sub
在這個範例中,StartActivityForResult 方法用來啟動 InputActivity,並等待其返回結果。當 InputActivity 完成後,可以通過 Intent 傳回資料給原本的 Activity。
在 InputActivity 中,可以通過以下方式返回結果:
Sub btnSubmit_Click
Dim intent As Intent
intent.Initialize("", "")
intent.PutExtra("inputData", "User input data")
Activity.SetResult(RESULT_OK, intent)
Activity.Finish
End Sub
這樣,在 InputActivity 完成任務後,它會將輸入資料返回給原本啟動它的 Activity。
Intent 也可以用來啟動其他應用程式或調用系統功能,這樣可以讓你的應用程式與設備上的其他應用和服務進行互動。
Sub btnDialPhone_Click
Dim intent As Intent
intent.Initialize(intent.ACTION_DIAL, "tel:123456789")
StartActivity(intent)
End Sub
這個範例中,我們使用 Intent 撥打電話。ACTION_DIAL 是 Android 提供的預定義動作,用來調用系統的撥號介面。
2. 調用系統功能
你也可以使用 Intent 調用系統的功能,如打開相機、拍照、選擇照片等。
Sub btnTakePhoto_Click
Dim intent As Intent
intent.Initialize("android.media.action.IMAGE_CAPTURE", "")
StartActivity(intent)
End Sub
在這個範例中,我們使用 Intent 啟動相機應用,讓用戶拍攝照片。拍攝完成後,照片將存儲在系統指定的存儲位置。
3. 接收其他應用的Intent
你的應用程式也可以設置為接收來自其他應用程式的 Intent。這樣,其他應用程式就可以將資料發送到你的應用程式中進行處理。
Sub Activity_Create(FirstTime As Boolean)
Dim intent As Intent = Activity.GetStartingIntent
If intent.Action = intent.ACTION_VIEW Then
Dim data As String = intent.GetData
Log("Received data: " & data)
End If
End Sub
這段程式碼展示了如何在 Activity 中處理來自其他應用程式的 Intent。ACTION_VIEW 是常見的動作類型之一,通常用於處理資料的顯示或編輯。
以下是一個完整的範例程式,展示了如何在 B4A 中使用 Intent 和 Activity 來實現應用程式之間的通訊和交互。
Sub Process_Globals
' 全域變數
End Sub
Sub Globals
Dim btnSendData As Button
Dim btnDialPhone As Button
Dim lblResult As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("MainLayout")
btnSendData.Text = "傳送資料到下一個Activity"
btnDialPhone.Text = "撥打電話"
End Sub
Sub btnSendData_Click
Dim intent As Intent
intent.Initialize("","")
intent.SetComponent("com.example.app/.DetailActivity")
intent.PutExtra("username", "JohnDoe")
intent.PutExtra("age", 30)
StartActivity(intent)
End Sub
Sub btnDialPhone_Click
Dim intent As Intent
intent.Initialize(intent.ACTION_DIAL, "tel:123456789")
StartActivity(intent)
End Sub
Sub Activity_Result (Result As Int, Intent As Intent)
If Result = RESULT_OK Then
Dim returnedData As String = Intent.GetExtra("inputData")
lblResult.Text = "返回的資料: " & returnedData
End If
End Sub
這個範例展示了如何使用 Intent 來傳遞資料和啟動其他應用程式功能。透過掌握 Intent 和 Activity 的使用技巧,你可以開發出功能強大且互動性高的行動應用程式。
參考網址
https://www.b4x.com/android/forum/